package leitorescritorcomthread;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.RandomAccessFile;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.logging.Level;
import java.util.logging.Logger;

public class LeitorEscritorImplementacao extends UnicastRemoteObject implements LeitorEscritor {

    /**
     * Prefiri implementar um semáforo para facilitar a compreensão ao invés de
     * usar o que Java já oferece
     */
    public static Semaforo semaforo;
    OperacaoCliente operacaoCliente;
  
    public LeitorEscritorImplementacao() throws RemoteException {
        super();
        operacaoCliente = new OperacaoCliente();
        if (semaforo == null) {
            semaforo = new Semaforo(true, true);
        }
    }

    @Override
    public void receptorEProcessadorCliente(int idCliente, boolean operacao, String texto) {
        operacaoCliente.setIdCliente(idCliente);
        operacaoCliente.setOperacao(operacao);
        operacaoCliente.setServer(this);
        operacaoCliente.setTexto(texto);
        Thread thread = new Thread(operacaoCliente);
        thread.start();
    }

    public void escrever(String arquivo, String texto, int idCliente) throws RemoteException {

        try {
            while (semaforo.estaFechadoParaEscrita()) {}
            semaforo.fecharParaLeituraEscrita();
            String msg = "O cliente número " + idCliente + " está escrevendo '" + texto + "' no arquivo.";
            File file;

            
            System.out.println(msg);
            file = new File(arquivo);
            FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(texto+ "-");
            bw.close();
            fw.close();
            semaforo.abrirParaLeituraEscrita();
            
            msg = "O cliente número " + idCliente + " terminou a sua escrita no arquivo.";
            System.out.println("\n" +msg);

        } catch (IOException ex) {
            Logger.getLogger(LeitorEscritorImplementacao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void ler(String arquivo, int idCliente) throws RemoteException {
        try {
            while (semaforo.estaFechadoParaLeitura()) {}            
            semaforo.fecharParaEscrita();
            
            BufferedReader buffRead;
            String linha = "";
            buffRead = new BufferedReader(new FileReader(arquivo));
            System.out.println("\n O cliente número " + idCliente + " começou a ler o arquivo. \n ");
            while (true) {
                linha = buffRead.readLine();
                if (linha != null) {
                    System.out.println(linha + " lido pelo cliente "+ idCliente);
                } 
                else 
                    break;
                
            }
            buffRead.close();
            semaforo.abrirParaEscrita();

            System.out.println("\n O cliente número " + idCliente + " terminou a sua leitura do arquivo. \n \n");
        } catch (IOException ex) {
        }
    }

}
